<?php

namespace App\Func\Office;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;

/**
 *  基于 phpoffice/phpspreadsheet 方法可以查手册或者查看下面这个大佬的博客
 *  ！！！ 请注意 ！！！
 *  请不要使用 xls 文件
 *  https://blog.csdn.net/jackbon8/article/details/107915006
 */


class ExcelFunc
{
    /**
     * 读取 Excel 文件，并在每行读取时执行回调函数
     *
     * @param string $filePath Excel 文件路径
     * @param callable $callback 回调函数，用于处理每行读取到的数据
     * @throws \PhpOffice\PhpSpreadsheet\Exception|\PhpOffice\PhpSpreadsheet\Reader\Exception
     */
    function readExcelWithCallback(string $filePath, callable $callback): void
    {
        $extension = pathinfo($filePath, PATHINFO_EXTENSION);
        // 判断文件是否是 .xlsx 格式
        if ($extension !== 'xlsx') {
            s_fail_return(null,trans('message.upload_err',[
                'name' => trans('key.file_format_error_can_file_type',[
                    'type' => 'xlsx'
                ]),
                'code' => ''
            ]));
        }
        // 使用 IOFactory 加载 Excel 文件
        $spreadsheet = IOFactory::load($filePath);
        // 获取活动工作表
        $worksheet = $spreadsheet->getActiveSheet();
        // 行号初始化为1
        $rowNumber = 1;
        // 获取最大行号
        $highestRow = $worksheet->getHighestRow();
        // 遍历每行，并执行回调函数处理数据
        foreach ($worksheet->getRowIterator() as $row) {
            $rowData = [];
            foreach ($row->getCellIterator() as $cell) {
                $rowData[] = $cell->getValue();
            }
            // 将读取到的数据传递给回调函数进行处理
            $callback($rowData,$rowNumber,$highestRow);
            $rowNumber++;
        }
    }

    function getExcelFromData(Spreadsheet $spreadsheet,string $outPath,string $fileName,bool $debug = false):bool|string{
        try {
            $writer = new Xlsx($spreadsheet);
            $writer->save($outPath.DIRECTORY_SEPARATOR.$fileName.".xlsx");
            return $outPath.DIRECTORY_SEPARATOR.$fileName.".xlsx";
        }catch (\Exception $exception){
            if($debug){
                dd($exception);
            }

            return false;
        }
    }
}
